%% 存储服务的实现模块，这个存储服务使用了dets做为存储
-module(xbt_storage_dets).
%% 存储服务的管理接口，它是由存储服务调用的
-export([start/1,stop/0]).
%% 存储服务的回调，它是一个存储服务模块所必须实现的接口
-export([xbt_set/2,xbt_append/2,xbt_delete/1,xbt_get/1]).

-include("xbt.hrl").

%% 启用存储服务模块
start(File)    ->
    xbt_open(File).

%% 停用存储服务模块
stop()     ->
    xbt_close().

xbt_set(Key,Value)    ->
    dets:insert(?MODULE,{Key,Value}).

xbt_append(Key,Value) ->
    case dets:lookup(?MODULE, Key) of
        []         ->
            ok = dets:insert(?MODULE,{Key,Value});
        [{_,Vold}] ->
            ok = dets:insert(?MODULE,{Key,list_to_binary([Vold,Value])}) 
    end.

xbt_delete(Key)       ->
    dets:delete(?MODULE, Key).

xbt_get(Key)          ->
    case dets:lookup(?MODULE, Key) of
        [{_,Value}]  ->
            {ok,Value};
        []           ->
            {error,undefine};
        {error,Reason}    ->
            {error,Reason}
    end.

%% 初始化dets的存储文件
xbt_open(File) ->
    case dets:open_file(?MODULE,[{file,File},{ram_file,true}]) of
        {ok,?MODULE}    ->
            true;
        {error,_Reason} ->
            io:format("cannot open dets table~n"),
            exit(eDetsOpen)
    end.

%% 关闭dets的存储文件
xbt_close() -> dets:close(?MODULE).


